package scholarsearch.activity;





import java.util.ArrayList;
import java.util.HashMap;


import scholarsearch.android.ListViewHeightAdapter;
import scholarsearch.android.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class FiltraRisultati extends Activity {
	public final static int SUCCESS_RETURN_CODE = 1;
	private int[] data=new int[2];
	private int[] citazioni=new int[2];
	private ArrayList<String> variazioneNomeAutore=new ArrayList<String>();
	private ArrayList<String> coAutori=new ArrayList<String>();
	private ArrayList<String> tipi=new ArrayList<String>();
	private boolean[] variazioneNomeAutoreBoolean;
	private boolean[] coAutoriBoolean;
	private boolean[] tipiBoolean;
	private EditText massimoAnnoEditText;
	private EditText minimoAnnoEditText;
	private EditText massimoCitazioneEditText;
	private EditText minimoCitazioneEditText;
	private ListView listViewVariazioneNomeAutore;
	private ListView listViewCoAutori;
	private ListView listViewTipoPubblicazione;
	private ImageView chiudi;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.filtra_risultati);
		Intent intent=getIntent(); // l'intent di questa activity
		String pkg=getPackageName();
		
		data[0]=intent.getExtras().getInt(pkg+".dataInizio", -1);
		data[1]=intent.getExtras().getInt(pkg+".dataFine", -1);
		citazioni[0]=intent.getExtras().getInt(pkg+".citazioniInizio", -1);
		citazioni[1]=intent.getExtras().getInt(pkg+".citazioniFine", -1);
		variazioneNomeAutore=intent.getStringArrayListExtra(pkg+".variazioneNomeAutore");
		variazioneNomeAutoreBoolean=new boolean[variazioneNomeAutore.size()];
		coAutori=intent.getStringArrayListExtra(pkg+".coAutori");
		coAutoriBoolean=new boolean[coAutori.size()];
		tipi=intent.getStringArrayListExtra(pkg+".tipi");
		tipiBoolean=new boolean[tipi.size()];
		
		// STANZAIMENTO EDITTEXT
		massimoAnnoEditText= (EditText) findViewById(R.id.massimoAnnoEditText);
		massimoAnnoEditText.setText(""+data[1]);
		
		minimoAnnoEditText= (EditText) findViewById(R.id.minimoAnnoEditText);
		minimoAnnoEditText.setText(""+data[0]);
		
		massimoCitazioneEditText= (EditText) findViewById(R.id.massimoCitazioneEditText);
		massimoCitazioneEditText.setText(""+citazioni[1]);
		
		minimoCitazioneEditText= (EditText) findViewById(R.id.minimoCitazioneEditText);
		minimoCitazioneEditText.setText(""+citazioni[0]);
		
		// STANZAIMENTO LISTVIEW
		
		// ListView VariazioneNomeAutore
		ArrayList<HashMap<String, Object>> dataNomeAutore=new ArrayList<HashMap<String,Object>>();
		for(int i=0;i<variazioneNomeAutore.size();i++){
			HashMap<String,Object> nomeAutoreMap=new HashMap<String, Object>();//creiamo una mappa di valori
			nomeAutoreMap.put("nome",variazioneNomeAutore.get(i));
	    	dataNomeAutore.add(nomeAutoreMap);		    
		}
		String[] fromAutore={"nome"}; //dai valori contenuti in queste chiavi
	    int[] toAutore={R.id.elementoFiltra};//agli id dei layout
	    
	    //costruzione dell adapter
	    SimpleAdapter adapterNomeAutore=new SimpleAdapter(
	    		getApplicationContext(),
	    		dataNomeAutore,//sorgente dati
	    		R.layout.elemento_listview_filtra, //layout contenente gli id di "to"
	    		fromAutore,
	    		toAutore);
	   
	    //utilizzo dell'adapter
	    listViewVariazioneNomeAutore=(ListView)findViewById(R.id.listViewVariazioneNomeAutore);
		listViewVariazioneNomeAutore.setAdapter(adapterNomeAutore);
		ListViewHeightAdapter.setListViewHeightBasedOnChildren(listViewVariazioneNomeAutore);
		listViewVariazioneNomeAutore.setOnItemClickListener(new OnItemClickListener(){

			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// TODO Auto-generated method stub
				ImageView check = (ImageView)view.findViewById(R.id.checkboxFiltra);
				if (variazioneNomeAutoreBoolean[position]==false){
					variazioneNomeAutoreBoolean[position]=true;
					check.setImageResource(android.R.drawable.checkbox_on_background);
				}
				else{
					variazioneNomeAutoreBoolean[position]=false;
					check.setImageResource(android.R.drawable.checkbox_off_background);
				}
			}
	    	
	    });
		// ListView CoAutori
		ArrayList<HashMap<String, Object>> dataTopCoautori=new ArrayList<HashMap<String,Object>>();
		for(int i=0;i<coAutori.size();i++){
			HashMap<String,Object> coAutoriMap=new HashMap<String, Object>();//creiamo una mappa di valori
			coAutoriMap.put("nome",coAutori.get(i));
			dataTopCoautori.add(coAutoriMap);		    
		}
		String[] fromCoAutori={"nome"}; //dai valori contenuti in queste chiavi
	    int[] toCoAutori={R.id.elementoFiltra};//agli id dei layout
	    
	    //costruzione dell adapter
	    SimpleAdapter adapterCoAutori=new SimpleAdapter(
	    		getApplicationContext(),
	    		dataTopCoautori,//sorgente dati
	    		R.layout.elemento_listview_filtra, //layout contenente gli id di "to"
	    		fromCoAutori,
	    		toCoAutori);
	   
	    //utilizzo dell'adapter
	    listViewCoAutori=(ListView)findViewById(R.id.listViewCoAutori);
	    listViewCoAutori.setAdapter(adapterCoAutori);
	    ListViewHeightAdapter.setListViewHeightBasedOnChildren(listViewCoAutori);
	    listViewCoAutori.setOnItemClickListener(new OnItemClickListener(){

			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// TODO Auto-generated method stub
				ImageView check = (ImageView)view.findViewById(R.id.checkboxFiltra);
				if (coAutoriBoolean[position]==false){
					coAutoriBoolean[position]=true;
					check.setImageResource(android.R.drawable.checkbox_on_background);
				}
				else{
					coAutoriBoolean[position]=false;
					check.setImageResource(android.R.drawable.checkbox_off_background);
				}
			}
	    	
	    });
		
		// ListView Tipo Pubblicazione
	    ArrayList<HashMap<String, Object>> dataTipoPubblicazione=new ArrayList<HashMap<String,Object>>();
		for(int i=0;i<tipi.size();i++){
			HashMap<String,Object> tipoPubblicazioneMap=new HashMap<String, Object>();//creiamo una mappa di valori
			tipoPubblicazioneMap.put("tipo",tipi.get(i));
			dataTipoPubblicazione.add(tipoPubblicazioneMap);		    
		}
		String[] fromTipoPubblicazione={"tipo"}; //dai valori contenuti in queste chiavi
	    int[] toTipoPubblicazione={R.id.elementoFiltra};//agli id dei layout
	    
	    //costruzione dell adapter
	    SimpleAdapter adapterTipoPubblicazione=new SimpleAdapter(
	    		getApplicationContext(),
	    		dataTipoPubblicazione,//sorgente dati
	    		R.layout.elemento_listview_filtra, //layout contenente gli id di "to"
	    		fromTipoPubblicazione,
	    		toTipoPubblicazione);
	   
	    //utilizzo dell'adapter
	    listViewTipoPubblicazione=(ListView)findViewById(R.id.listViewTipoPubblicazione);
	    listViewTipoPubblicazione.setAdapter(adapterTipoPubblicazione);
	    ListViewHeightAdapter.setListViewHeightBasedOnChildren(listViewTipoPubblicazione);
	    listViewTipoPubblicazione.setOnItemClickListener(new OnItemClickListener(){

			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// TODO Auto-generated method stub
				ImageView check = (ImageView)view.findViewById(R.id.checkboxFiltra);
				if (tipiBoolean[position]==false){
					tipiBoolean[position]=true;
					check.setImageResource(android.R.drawable.checkbox_on_background);
				}
				else{
					tipiBoolean[position]=false;
					check.setImageResource(android.R.drawable.checkbox_off_background);
				}
			}
	    	
	    });
		
		//STANZIAMENTO IMAGEVIEW CHIUDI
		chiudi= (ImageView)findViewById(R.id.chiudiFiltraRisultati);
		chiudi.setOnClickListener(new OnClickListener() {		    
		    public void onClick(View v) {
		    	Intent intent = new Intent();
				Bundle b = new Bundle();
				b.putString("TEXT", "indietro");
				intent.putExtras(b);
				setResult(SUCCESS_RETURN_CODE, intent);
				finish();
		    }
		  });
	}

	/**
     * Metodo di gestione del pulsante Rimuovi Filtri
     * 
     * @param v, View
     * 
     *         Riferimento al button premuto
     */
    public void rimuovifiltriRisultati(View v) {
    	Intent intent = new Intent();
		Bundle b = new Bundle();
		b.putString("TEXT", "rimuoviFiltri");
		intent.putExtras(b);
		setResult(SUCCESS_RETURN_CODE, intent);
		finish();
	}
	/**
     * Metodo di gestione del pulsante Filtra Risultati
     * 
     * @param v, View
     * 
     *         Riferimento al button premuto
     */
    public void filtraRisultati(View v) {
    	boolean[] checkParametri=new boolean[6];
    	String errore="";
    	if ((Integer.parseInt(massimoAnnoEditText.getText().toString()))<=data[1]&&(Integer.parseInt(massimoAnnoEditText.getText().toString()))>=data[0]) checkParametri[0]=true;
    	if ((Integer.parseInt(minimoAnnoEditText.getText().toString()))>=data[0]&&(Integer.parseInt(minimoAnnoEditText.getText().toString()))<=data[1]) checkParametri[1]=true;	
    	if ((Integer.parseInt(massimoAnnoEditText.getText().toString()))>=Integer.parseInt(minimoAnnoEditText.getText().toString())) checkParametri[2]=true;
    	if ((Integer.parseInt(massimoCitazioneEditText.getText().toString()))<=citazioni[1]&&(Integer.parseInt(massimoCitazioneEditText.getText().toString()))>=citazioni[0]) checkParametri[3]=true;
    	if ((Integer.parseInt(minimoCitazioneEditText.getText().toString()))>=citazioni[0]&&(Integer.parseInt(minimoCitazioneEditText.getText().toString()))<=citazioni[1]) checkParametri[4]=true;	
    	if ((Integer.parseInt(massimoCitazioneEditText.getText().toString()))>=Integer.parseInt(minimoCitazioneEditText.getText().toString())) checkParametri[5]=true;
    	
    	boolean primoErrore=true;
    	if (checkParametri[0]==false) {
    		errore="- Anno massimo non conforme al parametro consentito";
    		massimoAnnoEditText.setText(""+data[1]);
    		primoErrore=false;
    	}
    	if (checkParametri[1]==false){
    		if (primoErrore==true)errore="- Anno minimo non conforme al parametro consentito";
    		else errore=errore+"\n- Anno minimo non conforme al parametro consentito";
    		minimoAnnoEditText.setText(""+data[0]);
    		primoErrore=false;
    	}
    	if (checkParametri[2]==false){
    		if (primoErrore==true)errore="- Anno minimo maggiore di anno masimo";
    		else errore=errore+"\n- Anno minimo maggiore di anno masimo";
    		massimoAnnoEditText.setText(""+data[1]);
    		minimoAnnoEditText.setText(""+data[0]);
    		primoErrore=false;
    	}
    	if (checkParametri[3]==false){
    		if (primoErrore==true)errore="- Numero massimo di citazioni non conforme al parametro consentito";
    		else errore=errore+"\n- Numero massimo di citazioni non conforme al parametro consentito";
    		minimoCitazioneEditText.setText(""+citazioni[1]);
    		primoErrore=false;
    	}
    	if (checkParametri[4]==false){
    		if (primoErrore==true)errore="- Numero minimo di citazioni non conforme al parametro consentito";
    		else errore=errore+"\n- Numero minimo di citazioni non conforme al parametro consentito";
    		minimoCitazioneEditText.setText(""+citazioni[0]);
    		primoErrore=false;
    	}
    	if (checkParametri[5]==false){
    		if (primoErrore==true)errore="- Numero minimo di citazioni maggiore di numero masimo";
    		else errore=errore+"\n- Numero minimo di citazioni maggiore di numero masimo";
    		massimoCitazioneEditText.setText(""+citazioni[1]);
    		minimoCitazioneEditText.setText(""+citazioni[0]);
    		primoErrore=false;
    	}
    	if (primoErrore==false){
    		AlertDialog.Builder erroreFiltro = new AlertDialog.Builder(this);
    		erroreFiltro.setMessage(errore)
        	 .setCancelable(false)
        	 .setNegativeButton("ok", new DialogInterface.OnClickListener() {
        	 public void onClick(DialogInterface dialog, int id) {
        		 dialog.cancel();
        	 }
        	 });
        	 AlertDialog alert = erroreFiltro.create();
        	 alert.setTitle("Attenzione!");
        	 alert.show();
    	}
    	else{
    		 String selected = ""+Integer.parseInt(massimoAnnoEditText.getText().toString())+","+Integer.parseInt(minimoAnnoEditText.getText().toString())+"#"+Integer.parseInt(massimoCitazioneEditText.getText().toString())+","+Integer.parseInt(minimoCitazioneEditText.getText().toString())+"#";
    		 
             
    		 boolean primo=true;
             for(int i = 0; i < variazioneNomeAutoreBoolean.length; i++){

                 if(variazioneNomeAutoreBoolean[i]==true) {
                	 if (primo==false) selected +=",";
                     selected += rimuoviNumero(variazioneNomeAutore.get(i));
                     primo=false;
                 }

             }
             if (primo==true) selected +="%";
             selected +="#";
             primo=true;
             
             for(int i = 0; i < coAutoriBoolean.length; i++){

                 if(coAutoriBoolean[i]==true) {
                	 if (primo==false) selected +=",";
                     selected += rimuoviNumero(coAutori.get(i));       
                     primo=false;
                 }

             }
             if (primo==true) selected +="%";
             selected +="#";             
             primo=true;
             
             for(int i = 0; i < tipiBoolean.length; i++){
                 if(tipiBoolean[i]==true) {
                	 if (primo==false) selected +=",";
                     selected += rimuoviNumero(tipi.get(i)); 
                     primo=false;
                 }

             }
             if (primo==true) selected +="%";

         
	    	Intent intent = new Intent();
			Bundle b = new Bundle();
			b.putString("TEXT", selected);
			intent.putExtras(b);
			setResult(SUCCESS_RETURN_CODE, intent);
			finish();
    	}
	}

    @Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
	    if (keyCode == KeyEvent.KEYCODE_BACK) {
	    	Intent intent = new Intent();
				Bundle b = new Bundle();
				b.putString("TEXT", "indietro");
				intent.putExtras(b);
				setResult(SUCCESS_RETURN_CODE, intent);
				finish();
	    	return true;
	    }
	    return super.onKeyDown(keyCode, event);
	}
    
    /**
     * Metodo per rimuovere il numero degli articoli da un'autore, coautore o tipo di pubblicazione
     * 
     * @param stringa
     * @return, stringa senza numero di articoli
     */
    private String rimuoviNumero(String stringa){
		for (int j=stringa.length()-1;j>=0;j--){			
			char ch=stringa.charAt(j);
			if (ch=='('){				
				stringa=stringa.substring(0,j-1);
				j=0;
			}
		}
		return stringa;
    	
    }
}
